home *** CD-ROM | disk | FTP | other *** search
/ Amiga Magazin: Amiga-CD 1995 October / Amiga-CD 1995 #10.iso / amiga-magazin / farbdithering / listing2 < prev    next >
Text File  |  1995-08-30  |  2KB  |  49 lines

  1. void DitherFS(Picture *Pic)
  2. {
  3.   WORD *temp,*this,*next,*swap;
  4.   LONG x,y,v,r,pixel,index;
  5.  
  6.   // Zwischenspeicher beschaffen
  7.   if(temp = (WORD *)AllocVec(sizeof(WORD) * (2 *
  8.                        (1 + Pic -> Width + 1)),MEMF_ANY))
  9.   { memset(temp,0,sizeof(WORD) * (2 * (1 + Pic -> Width + 1)));
  10.  
  11.     // Die beiden Zeilenpuffer werden initialisiert
  12.     this = &temp[1]; next = &temp[1 + (1 + Pic -> Width + 1)];
  13.  
  14.     for(y = 0 ; y < Pic -> Height ; y++)
  15.     { for(x = 0 ; x < Pic -> Width ; x++)
  16.       { // Position des Pixels bestimmen
  17.         index = x + y * Pic -> Width;
  18.  
  19.         // Helligkeitswert berechnen (0 = Min, 255 = Max)
  20.         v = (Pic -> Red[index] + Pic -> Green[index] +
  21.              Pic -> Blue[index]) / 3;
  22.         v = this[x] + v;    // Fehlerwert aufschlagen
  23.  
  24.         // Ist die Helligkeit größer als der Schwellwert,
  25.         // ein weißes Pixel setzen, sonst ein schwarzes
  26.         if(v > 127)  pixel = 255;
  27.         else         pixel = 0;
  28.  
  29.         // Der "Fehler" ist die Differenz zwischen dem
  30.         // berechneten Pixelwert und dem zu zeichnenden
  31.         r = v - pixel;
  32.         this[x + 1] += (7 * r) / 16;    // 7/16 rechts
  33.         next[x - 1] += (3 * r) / 16;    // 3/16 links unten
  34.         next[x    ] += (5 * r) / 16;    // 5/16 unten
  35.         next[x + 1] += (    r) / 16;    // 1/16 rechts unten
  36.  
  37.         // Das Pixel setzen
  38.         SetAPen(RPort,pixel); WritePixel(RPort,x,y);
  39.       }
  40.       // Der Inhalt der folgenden in die aktuelle Zeile
  41.       swap = this; this = next; next = swap;
  42.  
  43.       // Die folgende Zeile wird gelöscht
  44.       memset(next,0,sizeof(WORD) * Pic -> Width);
  45.     }
  46.     FreeVec(temp);
  47.   }
  48. }
  49.